package org.dinqy;

import java.util.Arrays;
import java.util.List;

/**
 * @author armandino (at) gmail.com
 */
public final class WhereClauseBean implements ClauseBean {
    private final String fieldName;
    private final ClauseType clauseType;
    private final Criterion criterion;
    
    WhereClauseBean(String fieldName, ClauseType clauseType, Criterion criterion) {
        this.fieldName = fieldName;
        this.clauseType = clauseType;
        this.criterion = criterion;
    }

    public ClauseType getClauseType() {
        return clauseType;
    }

    public List<Object> getClauseArguments() {
        return Arrays.asList(criterion.getPredicateArguments());
    }
    
    public void accept(ClauseBeanVisitor visitor) {
        visitor.visit(this);
    }
    
    public String toJPQL() {
        final PredicateType predicateType = criterion.getPredicateType();
        final StringBuilder sb = new StringBuilder();
        
        if(clauseType == ClauseType.WHERE)
            sb.append(" where");
        if(clauseType == ClauseType.AND || clauseType == ClauseType.OR)
            sb.append(" ").append(clauseType.name().toLowerCase());
        sb.append(" obj.").append(fieldName);
        sb.append(predicateType.toJPQL());
        if(predicateType.getNumberOfRequiredArgs() == 1)
            sb.append("?");
        return sb.toString();
    }

}
